package com.yangfan.thread.interview_questions;

/**
 * @description: 面试题1
 * @author: yangfan
 * @date: Created in 2020/2/13 0013 15:42
 * @modified By:
 */
public class ThreadConcurrencyIssue1 {

    //https://www.jianshu.com/p/931e2ea582ee
    //题目二：写两个线程，一个线程打印1-52，另一个线程打印A-Z，打印顺序是12A34B...5152Z；

    private static volatile boolean flag = true; // true 代表让 s子线程 执行 false 代表让 主线程执行

    private static final Object LOCK = new Object();


    public static void main(String[] args) throws InterruptedException {

        ThreadConcurrencyIssue1 t = new ThreadConcurrencyIssue1();
        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        t.subRun();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();


        for (int i = 0; i < 10; i++) {
            t.mainRun();
        }


    }


    public void subRun() throws InterruptedException {

        synchronized (LOCK) {

            int index = 0;

            while (flag == false) {//如果现在 应该让 主线程 执行 就进行等待
                LOCK.wait();//其他线程没有执行完毕则等待
            }

            //如果没有人在执行我就执行 打印两次
            while (index < 2) {
                System.out.println("子线程在运行-----" + index);
                index++;
            }

            flag = false;//我执行完了
            LOCK.notify();

        }

    }


    public void mainRun() throws InterruptedException {

        synchronized (LOCK) {

            int index = 0;

            while (flag == true) {//如果现在 应该让 子线程 执行 就进行等待
                LOCK.wait();//其他线程没有执行完毕则等待
            }

            while (index < 2) {
                System.out.println("主线程在运行-----" + index);
                index++;
            }

            flag = true;//我执行完了
            LOCK.notify();

        }

    }


}
